package com.gem.netty.message.swap;

import com.gem.entity.Game;
import com.gem.enums.ClientMessageType;
import com.gem.enums.MessageColorType;
import com.gem.factory.game.GameFactory;
import com.gem.netty.entity.ClientContent;
import com.gem.utils.R;

/**
 * Author: Xhy
 * CreateTime: 2022-12-14 21:25
 * 换牌拿宝石换贵族统一抽象类
 */
public abstract class AbstractSwapBase {


    public R doSwap(ClientContent content){
        R r = null;
        if (!isCurrentUserRound(content)){
            return R.error().data("color", MessageColorType.SYSTEM_MESSAGE.type).message("不是你的回合").type(ClientMessageType.ROUND_BEGAN.type);
        }
        r = isSwapCardOrGetGemRound(content);
        if (!r.getState()){
            return r;
        }
        r = isVerify(content);
        if (!r.getState()){
            return r;
        }
        r = isStock(content);
        if (!r.getState()){
            return r;
        }
        // 如果是换取贵族，则这里需要多一步
        r = isOwnNobility(content);
        if (!r.getState()){
            return r;
        }

        r = isSwap(content);
        if (!r.getState()){
            return r;
        }
        return R.ok();
    }

    // 当前回合是否是当前用户
    protected boolean isCurrentUserRound(ClientContent content){
        Game game = GameFactory.get(content.getRoomId());
        if (!content.getSendId().equals(game.getUsers().get(game.getCurrentIndex() % 4).getId())){
            return false;
        }
        return true;
    }
    // 格式是否正确
    protected abstract R isVerify(ClientContent content);
    // 是否还有库存
    protected abstract R isStock(ClientContent content);
    // 是否用户已经拥有贵族
    protected abstract R isOwnNobility(ClientContent content);
    // 是否可以兑换
    protected abstract R isSwap(ClientContent content);
    // 是否换牌/拿宝石回合
    protected abstract R isSwapCardOrGetGemRound(ClientContent content);
}
